//    |  /           |
//    ' /   __| _` | __|  _ \   __|
//    . \  |   (   | |   (   |\__ \.
//   _|\_\_|  \__,_|\__|\___/ ____/
//                   Multi-Physics
//
//  License:		 BSD License
//					 Kratos default license: kratos/license.txt
//
//  Main authors:    Pooyan Dadvand
//

#pragma once

// System includes

// External includes

// Project includes
#include "includes/define.h"
#include "containers/variable.h"
#include "includes/kratos_components.h"
#include "includes/ublas_interface.h"
#include "containers/array_1d.h"

#undef  KRATOS_EXPORT_MACRO
#define KRATOS_EXPORT_MACRO KRATOS_API

//TODO: move to the Kratos DEMApplication or eventually to the FluidDynamicsAsNeeded
namespace Kratos
{
     //for DEM Application:
    KRATOS_DEFINE_VARIABLE( int, FRAME_OF_REFERENCE_TYPE )
    KRATOS_DEFINE_VARIABLE( double, PARTICLE_MASS )
    KRATOS_DEFINE_VARIABLE( double, RADIUS )
    KRATOS_DEFINE_VARIABLE( double, SEARCH_RADIUS_INCREMENT )
    KRATOS_DEFINE_VARIABLE( double, SEARCH_RADIUS_INCREMENT_FOR_WALLS )
    KRATOS_DEFINE_VARIABLE( double, DEM_DELTA_TIME )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( TOTAL_FORCES )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( DAMP_FORCES )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( AUX_VEL )

    KRATOS_DEFINE_VARIABLE( Vector, NEIGHBOURS_IDS_DOUBLE )
    KRATOS_DEFINE_VARIABLE( DenseVector<double>, BASSET_HISTORIC_INTEGRANDS )
    KRATOS_DEFINE_VARIABLE( DenseVector<double>, HINSBERG_TAIL_CONTRIBUTIONS )
    KRATOS_DEFINE_VARIABLE( Vector, PARTICLE_ROTATE_SPRING_FAILURE_TYPE )

    KRATOS_DEFINE_VARIABLE( DenseVector<int>, OLD_NEIGHBOURS_IDS )
    KRATOS_DEFINE_VARIABLE( DenseVector<int>, INI_NEIGHBOURS_IDS )
    KRATOS_DEFINE_VARIABLE( DenseVector<int>, CONTINUUM_INI_NEIGHBOURS_IDS )
    KRATOS_DEFINE_VARIABLE( DenseVector<int>, NEIGHBOURS_IDS )
    KRATOS_DEFINE_VARIABLE( DenseVector<int>, PARTICLE_INITIAL_FAILURE_ID )
    KRATOS_DEFINE_VARIABLE( DenseVector<int>, CONTINUUM_PARTICLE_INITIAL_FAILURE_ID )

    KRATOS_DEFINE_VARIABLE( int, FIXED_MESH_OPTION)
    KRATOS_DEFINE_VARIABLE( int, PARTICLE_MATERIAL )

    KRATOS_DEFINE_VARIABLE( std::string, ELEMENT_TYPE )

    typedef DenseVector<array_1d<double,3> > VectorArray3Double;
    KRATOS_DEFINE_VARIABLE( VectorArray3Double, PARTICLE_ROTATE_SPRING_MOMENT )

    // Swimming DEM Application BEGINNING
    KRATOS_DEFINE_VARIABLE( Matrix, PERMEABILITY)
    KRATOS_DEFINE_VARIABLE( Matrix, CONSISTENT_MASS_MATRIX)
    KRATOS_DEFINE_VARIABLE( int, NUMBER_OF_INIT_BASSET_STEPS )
    KRATOS_DEFINE_VARIABLE( int, COUPLING_TYPE)
    KRATOS_DEFINE_VARIABLE( int, NON_NEWTONIAN_OPTION )
    KRATOS_DEFINE_VARIABLE( int, MANUALLY_IMPOSED_DRAG_LAW_OPTION )
    KRATOS_DEFINE_VARIABLE( int, DRAG_MODIFIER_TYPE )
    KRATOS_DEFINE_VARIABLE( int, BUOYANCY_FORCE_TYPE )
    KRATOS_DEFINE_VARIABLE( int, DRAG_FORCE_TYPE )
    KRATOS_DEFINE_VARIABLE( int, VIRTUAL_MASS_FORCE_TYPE )
    KRATOS_DEFINE_VARIABLE( int, BASSET_FORCE_TYPE )
    KRATOS_DEFINE_VARIABLE( int, LIFT_FORCE_TYPE )
    KRATOS_DEFINE_VARIABLE( int, MAGNUS_FORCE_TYPE )
    KRATOS_DEFINE_VARIABLE( int, HYDRO_TORQUE_TYPE )
    KRATOS_DEFINE_VARIABLE( int, FLUID_MODEL_TYPE )
    KRATOS_DEFINE_VARIABLE( int, DRAG_POROSITY_CORRECTION_TYPE )
    KRATOS_DEFINE_VARIABLE( int, TIME_STEPS_PER_QUADRATURE_STEP )
    KRATOS_DEFINE_VARIABLE( int, QUADRATURE_ORDER )
    KRATOS_DEFINE_VARIABLE( int, CURRENT_COMPONENT )
    KRATOS_DEFINE_VARIABLE( double, POWER_LAW_TOLERANCE )
    KRATOS_DEFINE_VARIABLE( double, PARTICLE_SPHERICITY )
    KRATOS_DEFINE_VARIABLE( double, INIT_DRAG_FORCE )
    KRATOS_DEFINE_VARIABLE( double, DRAG_LAW_SLOPE )
    KRATOS_DEFINE_VARIABLE( double, DISPERSE_FRACTION )
    KRATOS_DEFINE_VARIABLE( double, DISPERSE_FRACTION_RATE )
    KRATOS_DEFINE_VARIABLE( double, FLUID_FRACTION )
    KRATOS_DEFINE_VARIABLE( double, FLUID_FRACTION_OLD )
    KRATOS_DEFINE_VARIABLE( double, FLUID_FRACTION_RATE )
    KRATOS_DEFINE_VARIABLE( double, PHASE_FRACTION )
    KRATOS_DEFINE_VARIABLE( double, PHASE_FRACTION_RATE )
    KRATOS_DEFINE_VARIABLE( double, FLUID_FRACTION_FILTERED )
    KRATOS_DEFINE_VARIABLE( double, DISPERSE_FRACTION_PROJECTED )
    KRATOS_DEFINE_VARIABLE( double, FLUID_FRACTION_PROJECTED )
    KRATOS_DEFINE_VARIABLE( double, FLUID_DENSITY_PROJECTED )
    KRATOS_DEFINE_VARIABLE( double, FLUID_VISCOSITY_PROJECTED )
    KRATOS_DEFINE_VARIABLE( double, REYNOLDS_NUMBER )
    KRATOS_DEFINE_VARIABLE( double, DRAG_COEFFICIENT )
    KRATOS_DEFINE_VARIABLE( double, SHEAR_RATE_PROJECTED )
    KRATOS_DEFINE_VARIABLE( double, DELTA_TIME_QUADRATURE )
    KRATOS_DEFINE_VARIABLE( double, LAST_TIME_APPENDING )
    KRATOS_DEFINE_VARIABLE( double, TIME_AVERAGED_DOUBLE )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( VELOCITY_OLD )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( VELOCITY_OLD_OLD )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( ACCELERATION_MOVING_FRAME_ORIGIN )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( ANGULAR_VELOCITY_MOVING_FRAME)
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( ANGULAR_VELOCITY_MOVING_FRAME_OLD)
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( ANGULAR_ACCELERATION_MOVING_FRAME)
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( SLIP_VELOCITY )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( ADDITIONAL_FORCE )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( ADDITIONAL_FORCE_OLD )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( ADDITIONAL_FORCE_OLD_OLD )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( HYDRODYNAMIC_FORCE )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( HYDRODYNAMIC_MOMENT )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_VEL_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_VEL_PROJECTED_RATE )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_VEL_LAPL_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_VEL_LAPL_RATE_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_ACCEL_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_ACCEL_FOLLOWING_PARTICLE_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( MATERIAL_FLUID_ACCEL_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_VORTICITY_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( PARTICLE_VEL_FILTERED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( HYDRODYNAMIC_REACTION )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( MEAN_HYDRODYNAMIC_REACTION )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( DRAG_REACTION )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( LIFT_FORCE )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( VIRTUAL_MASS_FORCE )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( BASSET_FORCE )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( EXTERNAL_APPLIED_FORCE )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( EXTERNAL_APPLIED_MOMENT )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( BUOYANCY )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( PRESSURE_GRADIENT )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( PRESSURE_GRAD_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( DISPERSE_FRACTION_GRADIENT )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( DISPERSE_FRACTION_GRADIENT_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_FRACTION_GRADIENT )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( FLUID_FRACTION_GRADIENT_PROJECTED )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( PHASE_FRACTION_GRADIENT )
    KRATOS_DEFINE_3D_VARIABLE_WITH_COMPONENTS( TIME_AVERAGED_ARRAY_3 )

    // Swimming DEM Application END

    // Nano-particle only BEGIN
    KRATOS_DEFINE_VARIABLE(double, CATION_CONCENTRATION)
    // Nano-particle only END

    //SINTERING VARIABLES
    KRATOS_DEFINE_VARIABLE( double, ATOMIC_VOLUME )
    KRATOS_DEFINE_VARIABLE( double, SURFACE_ENERGY )
    KRATOS_DEFINE_VARIABLE( double, DIHEDRAL_ANGLE )
    KRATOS_DEFINE_VARIABLE( double, SINTERING_START_TEMPERATURE )
    KRATOS_DEFINE_VARIABLE( double, RELAXATION_TIME )
    KRATOS_DEFINE_VARIABLE( double, LARGE_VISCOSITY_COEFFICIENT )
    KRATOS_DEFINE_VARIABLE( double, PRE_EXP_DIFFUSION_COEFFICIENT )
    KRATOS_DEFINE_VARIABLE( double, GB_WIDTH )
    KRATOS_DEFINE_VARIABLE( double, ENTHAPLY_ACTIVATION )
    ///
}  // namespace Kratos.

#undef  KRATOS_EXPORT_MACRO
#define KRATOS_EXPORT_MACRO KRATOS_NO_EXPORT
